/*
* 1.
* */
class MinStack {
  constructor() {
    this.stack = [];
  }

  push(val) {
    return this.stack.push(val);
  }

  min() {
    return Math.min(...this.stack);
  }

  pop() {
    return this.stack.pop();
  }

  size() {
    return this.stack.length;
  }

  top() {
    return this.stack[this.size() - 1];
  }
}


//'(){}{}' "{{})"
// 栈
// let obj = {')': '(', ']': '[', '}': '{'};
// 判断栈里面有没有 括号 有 : 出栈 没有 入栈

class Stack {
  constructor() {
    this.stack = [];
  }

  toString() {
    return this.stack.join('');
  }

  push(val) {
    return this.stack.push(val);
  }

  pop() {
    return this.stack.pop();
  }

  top() {
    return this.stack[this.size() - 1];
  }

  size() {
    return this.stack.length;
  }
}

// str = "{([])}"  "[{]}"
function isEmpty(str) {
  let stack = new Stack();
  let obj = {')': '(', ']': '[', '}': '{'};
  // 栈里面如果有和 str[i] 对应的一项  就出栈  如果没有 就入栈
  for (let i = 0; i < str.length; i++) {
    // ] ==> [
    if ((stack.top() === obj[str[i]]) && stack.size() > 0) {
      // 出栈
      stack.pop();
    } else {
      // 入栈
      stack.push(str[i]);
    }
  }
  return stack.size() === 0;
}

console.log(isEmpty('{{([)]}}'));
